package com.bitoon.basketdudes.web.admin;

import com.bitoon.basketdudes.web.datos.*;
import com.bitoon.basketdudes.web.xhr.Noticias;
import java.io.File;
import java.io.FileOutputStream;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.*;
import org.jdom.*;
import org.apache.log4j.Logger;
import org.jdom.output.XMLOutputter;
import java.util.StringTokenizer;
import org.apache.struts2.ServletActionContext;
import org.jdom.input.SAXBuilder;

public class NoticiasAdmin extends Noticias {

    private int pagina = 1;
    private Integer cuantos;                                  //cuantos registros mostrar en admin
    private static String pathNoticias = "/bd/xml";
    private String idiomaElegido = idioma;                    //para recoger el idioma del admin
    private boolean insertar;                                 //si queremos insertar una nueva noticia
    //para la inserccion de nuevas noticias
    private String titulo;
    private String entradilla;
    private String fecha;
    private String cuerpo;
    private String accion;

    private Logger log = Logger.getLogger(NoticiasAdmin.class);

    //acceso a la clase estatica BaseActionAdmin
    private BaseActionAdmin bsaadmin = BaseActionAdmin.getInstance();

    @Override
    public String execute() {

        return SUCCESS;
    }

    public String elegirAccionNoticiasAdmin(){
        String retorno = "ver";

        log.debug("Accion: " + getAccion() + " retorno: "+ retorno);

        if(getAccion()!=null && getAccion().compareTo(retorno)!=0){
            insertarNoticiaXMLadmin();
            retorno = "nueva";

        }else{
            leerNoticiasXMLadmin();
        }

        return retorno;
    }

    public String leerNoticiasXMLadmin() {

        List<Noticia> retorno = null;

        //idiomaElegido = "es";
        try {
            Document doc = obtenerXMLNoticias();

            if (doc != null) {
                Element root = doc.getRootElement();
                List<Element> l = null;

                l = root.getChildren();

                if(getCuantos()==null){
                    setCuantos((Integer) LISTADO_NOTICIAS_ELEMENTOS_POR_PAGINA);
                }
                
                int totalRegistros = l.size();
                log.debug("Lista noticias: "+totalRegistros+" pagina: " + getPagina() + " cuantos: " +getCuantos());
                int totalPaginas = (totalRegistros-1)/getCuantos() + 1;

                int offset = (getPagina()-1) * getCuantos();
                int primero = (getPagina()-1)*getCuantos();
                int ultimo = getCuantos();
                //si hay menos registros que "cuantos"
                if(totalRegistros<getCuantos()){
                    ultimo = totalRegistros;
                } else {
                    //si es la ultima pagina
                    if(totalPaginas==getPagina() && totalRegistros!=getCuantos()){
                        ultimo = offset+(totalRegistros-getCuantos());
                    }
                }
                        
                //creamos la lista de noticias
                retorno = new ArrayList<Noticia>();
                Element el;

                log.debug("primero: "+primero);
                log.debug("ultimo: "+ultimo);
                for (int i=primero;i<ultimo;++i) {
                    el = l.get(i);
                    Noticia laNoticia = new Noticia();

                    laNoticia.setId(Integer.parseInt(el.getChild("id").getValue()));
                    laNoticia.setTitulo(el.getChild("titular").getValue());
                    laNoticia.setEntradilla(el.getChild("entradilla").getValue());
                    laNoticia.setCuerpo(el.getChild("cuerpo").getValue());
                    laNoticia.setUrl(el.getChild("url").getValue());
                    String sFecha = el.getChild("fecha").getText();
                    DateFormat df = new SimpleDateFormat("yyyyMMdd");
                    Date fech = df.parse(sFecha);
                    GregorianCalendar gc = new GregorianCalendar();
                    gc.setTime(fech);
                    laNoticia.setDia(gc.get(GregorianCalendar.DATE));
                    laNoticia.setMes(Integer.toString(gc.get(GregorianCalendar.MONTH)+1));
                    laNoticia.setAnyo(gc.get(GregorianCalendar.YEAR));

                    retorno.add(laNoticia);
                }
                log.debug("Elemento en la lista: " + retorno.size());

                setCabecera(new InfoCabeceraXHR());
                getCabecera().setCorrecto(1);
                getCabecera().setActual(getPagina());
                getCabecera().setTotal(totalPaginas);

                int p1=0, p2=0;

                if (getPagina() <= (LISTADO_NOTICIAS_HUECOS_LADO_PAGINA+1)) {
                    p1 = 1;
                    p2 = LISTADO_NOTICIAS_HUECOS_LADO_PAGINA*2 + 1;
                } else if (getPagina() >= (totalPaginas-getCuantos())) {
                    p1 = totalPaginas - (LISTADO_NOTICIAS_HUECOS_LADO_PAGINA*2);
                    p2 = totalPaginas;
                } else {
                    p1 = getPagina() - LISTADO_NOTICIAS_HUECOS_LADO_PAGINA;
                    p2 = getPagina() + LISTADO_NOTICIAS_HUECOS_LADO_PAGINA;
                }
                if (p1 < 1) {
                    p1 = 1;
                }
                if (p2 > totalPaginas) {
                    p2 = totalPaginas;
                }
                getCabecera().setPrimeraPagina(p1);
                getCabecera().setUltimaPagina(p2);

                setDatos(retorno);
                setCabecera(getCabecera());
            }
        } catch (Exception e) {
            log.error("Error", e);
        }

        return SUCCESS;
    }

    public String insertarNoticiaXMLadmin(){

        log.debug("Parametros: " + idiomaElegido + "-" +isInsertar()+ "-" +titulo+ "-" +entradilla+ "-" +fecha+ "-" +cuerpo);

        try{
            //si hay que insertar una noticia
            if(isInsertar()){
                Document doc = obtenerXMLNoticias();
                Element root = null;

                // Hay que poner como id del nuevo mensaje, el id del último almacenado + 1
                int ultimoId = 0;

                if (doc != null) {
                    root  = doc.getRootElement();
                    try{
                        ultimoId = Integer.parseInt(root.getChild("noticia").getChild("id").getValue());
                        log.debug("[ultimo_id]" + ultimoId);
                    ultimoId++;}catch(Exception e){ ultimoId=0; }
                } else {
                    root = new Element("noticias");
                    doc = new Document(root);
                }

                 //Monto la nueva noticia
                Element new_noticia = new Element("noticia");
                new_noticia.addContent(new Element("id").addContent(""+ultimoId));
                //monto la url a partir del titulo en minusculas,cambiando espacios por '-'
                //y simbolso que no sean letras/numeros,-,_ cambiarlos por vacío
                String nuevaUrl = titulo.toLowerCase().replace(" ", "-");
                String urlModificada  = "";
                for(int i = 0;i<nuevaUrl.length();++i){
                    if(nuevaUrl.charAt(i)>='0' && nuevaUrl.charAt(i)<='9'
                       || nuevaUrl.charAt(i)=='-' || nuevaUrl.charAt(i)=='_'
                       || nuevaUrl.charAt(i)>='a' && nuevaUrl.charAt(i)<='z'
                       || nuevaUrl.charAt(i)>='A' && nuevaUrl.charAt(i)<='Z'){
                        urlModificada += nuevaUrl.charAt(i);
                    }else{
                        if(nuevaUrl.charAt(i)=='á'){
                            urlModificada += 'a';
                        }
                        if(nuevaUrl.charAt(i)=='é'){
                            urlModificada += 'e';
                        }
                        if(nuevaUrl.charAt(i)=='í'){
                            urlModificada += 'i';
                        }
                        if(nuevaUrl.charAt(i)=='ó'){
                            urlModificada += 'o';
                        }
                        if(nuevaUrl.charAt(i)=='ú'){
                            urlModificada += 'u';
                        }
                        log.debug("CARACTER RARO: " + nuevaUrl.charAt(i));
                    }
                }

                log.debug("[Url nueva]"  + urlModificada);

                new_noticia.addContent(new Element("url").addContent(urlModificada));
                //saco la fecha, le quito los '/' y coloco los datos en este orden YYYYMMDD
                StringTokenizer st = new StringTokenizer(fecha,"/");
                String fechaDia = "";
                String fechaMes = "";
                String fechaAnio = "";
                //si es española la noticia, el formato recibido es ddmmyyyy, sino es mmddyyyy
                if(idiomaElegido.compareTo("es")==0){
                    fechaDia = st.nextToken().trim();
                    if(fechaDia.length()<2){
                        fechaDia = "0" + fechaDia;
                    }
                    fechaMes = st.nextToken().trim();
                    if(fechaMes.length()<2){
                        fechaMes = "0" + fechaMes;
                    }
                    fechaAnio = st.nextToken();
                }else{
                    fechaMes = st.nextToken().trim();
                    if(fechaMes.length()<2){
                        fechaMes = "0" + fechaMes;
                    }
                    fechaDia = st.nextToken().trim();
                    if(fechaDia.length()<2){
                        fechaDia = "0" + fechaDia;
                    }
                    fechaAnio = st.nextToken();
                }
                new_noticia.addContent(new Element("fecha").addContent(fechaAnio.trim()+fechaMes+fechaDia));
                new_noticia.addContent(new Element("titular").addContent(titulo));
                new_noticia.addContent(new Element("entradilla").addContent(new CDATA(entradilla)));
                new_noticia.addContent(new Element("cuerpo").addContent(new CDATA(cuerpo)));
                root.addContent(0,new_noticia);

                //grabo el XML con la nueva noticia
                volcarDocAFichero(doc);

            }
        } catch (Exception e) {
            log.error("Error", e);
            setMensajeAlerta("Ha ocurrido un error al insertar la noticia. Intentelo de nuevo.");
            return ERROR;
        }

        return SUCCESS;
    }

    public String borrarNoticias() {

        log.debug("borrando noticias ... " + getNoticia());

        String retorno = SUCCESS;

        if(getNoticia()!=null){
            for (String s : getNoticia()) {
                log.debug("Borrar la noticia " + s);
                borrarNoticiasPorId(Integer.parseInt(s));
            }
        }

        return retorno;

    }

    public String modificarNoticiaXMLadmin(){

        log.debug("Modifico: " + isInsertar()+ "-" +getUrlNoticia());

        try{
            //si hay que modificar una noticia
            if(isInsertar()){
                Document doc = obtenerXMLNoticias();

                //buscamos la noticia dentro de la lista y modificamos sus datos
                List children = doc.getRootElement().getChildren();
                Iterator iter = children.iterator();
                boolean sw = false;
                while (iter.hasNext() && sw==false) {
                    Element child = (Element)iter.next();
                    if (child.getChild("url").getValue().compareTo(getUrlNoticia())==0) {
                        log.debug("Encontrada Noticia: " + getUrlNoticia());
                        //saco la fecha, le quito los '/' y coloco los datos en este orden YYYYMMDD
                        StringTokenizer st = new StringTokenizer(fecha,"/");
                        String fechaDia = "";
                        String fechaMes = "";
                        String fechaAnio = "";
                        //si es española la noticia, el formato recibido es ddmmyyyy, sino es mmddyyyy
                        if(idiomaElegido.compareTo("es")==0){
                            fechaDia = st.nextToken().trim();
                            if(fechaDia.length()<2){
                                fechaDia = "0" + fechaDia;
                            }
                            fechaMes = st.nextToken().trim();
                            if(fechaMes.length()<2){
                                fechaMes = "0" + fechaMes;
                            }
                            fechaAnio = st.nextToken().trim();
                        }else{
                            fechaMes = st.nextToken();
                            if(fechaMes.length()<2){
                                fechaMes = "0" + fechaMes;
                            }
                            fechaDia = st.nextToken();
                            if(fechaDia.length()<2){
                                fechaDia = "0" + fechaDia;
                            }
                            fechaAnio = st.nextToken();
                        }
                        child.getChild("fecha").setText(fechaAnio.trim()+fechaMes+fechaDia);
                        child.getChild("titular").setText(titulo);
                        child.getChild("entradilla").removeContent();
                        child.getChild("entradilla").setContent(new CDATA(entradilla));
                        child.getChild("cuerpo").removeContent();
                        child.getChild("cuerpo").setContent(new CDATA(cuerpo));
                        sw=true;
                    }
                }

                //grabo el XML con la noticia modificada
                volcarDocAFichero(doc);

            }else{
                //cargo la noticia en el formulario
                BuscarNoticia();
            }
        } catch (Exception e) {
            log.error("Error", e);
            setMensajeAlerta("Ha ocurrido un error al insertar la noticia. Intentelo de nuevo.");
            return ERROR;
        }

        return SUCCESS;
    }

    public String BuscarNoticia(){

        try {
            Document doc = obtenerXMLNoticias();
            log.debug("doc: "+doc);
            
            if (doc != null) {
                //buscamos la noticia dentro de la lista y sacamos sus datos
                List children = doc.getRootElement().getChildren();
                Iterator iter = children.iterator();

                while (iter.hasNext()) {
                    Element child = (Element)iter.next();
                    log.debug("Child: "+child.getChild("titular").getValue());
                    log.debug("Busco:  " + getUrlNoticia());

                    if (child.getChild("url").getValue().compareTo(getUrlNoticia())==0) {
                        log.debug("Encontrada Noticia: " + getUrlNoticia());
                        titulo = child.getChild("titular").getValue();
                        entradilla = child.getChild("entradilla").getValue();

                        String sFecha = child.getChild("fecha").getText();
                        DateFormat df = new SimpleDateFormat("yyyyMMdd");
                        Date fcha = df.parse(sFecha);
                        GregorianCalendar gc = new GregorianCalendar();
                        gc.setTime(fcha);
                        String dia = ""+gc.get(GregorianCalendar.DATE);
                        String mes = ""+(gc.get(GregorianCalendar.MONTH)+1);
                        if(mes.length()<2){
                                mes = "0" + mes;
                        }
                        if(dia.length()<2){
                                dia = "0" + dia;
                        }
                        fecha = dia + "/" + mes + "/" + gc.get(GregorianCalendar.YEAR);
                        cuerpo = child.getChild("cuerpo").getValue();
                        log.debug("Titulo: " + titulo);
                    }
                }
            } 
        }catch (Exception e) {
            log.error("[BuscarNoticia]: ", e);
        }

        return SUCCESS;
    }

    @Override
    public void borrarNoticiasPorId(int idNoticia) {

        try {
            //formato de noticia
            Element root = new Element("noticias");
            Document nuevoDoc = new Document(root); //nuevo documento

            log.debug("id noticia: " + idNoticia);

            //lista actual de mensajes
            Document doc = obtenerXMLNoticias();
            if (doc != null) {
                //cogemos el children
                List children = doc.getRootElement().getChildren();
                log.debug("chidren: " + children +" nºelementos: "+children.size());
                Iterator iter = children.iterator();
                while (iter.hasNext()) {
                    Element child = (Element)iter.next();
                    log.debug("Element Child: "+child.getChild("id"));
                    if (child.getChild("id").getValue().equals(Integer.toString(idNoticia))) {
                        //no insertamos el mensaje en el nuevo doc
                        log.debug("id: " + idNoticia);
                    } else {
                        //borramos del iterator y añadimos el mensaje que no coincide
                        log.debug("Añadiendo " + child);
                        log.debug("nuevoDoc: " + nuevoDoc);
                        log.debug("name: " + child.getName());
                        iter.remove();
                        nuevoDoc.getRootElement().addContent(child);
                    }
                }

                // Grabar el nuevo doc con el elemento borrado
                volcarDocAFichero(nuevoDoc);
            }
        } catch (Exception e) {
            log.error("[borrarNoticiasPorId] ",e);
        }
    }

    @Override
    protected void volcarDocAFichero(Document doc) {
        try {
            File f = null;
            f = new File(ServletActionContext.getServletContext().getRealPath(getPathNoticias()));
            FileOutputStream fout = new FileOutputStream(f);

            XMLOutputter out = new XMLOutputter();
            out.output(doc, fout);
        } catch (Exception e) {
            log.error("[volcarFichero Noticia]", e);
        }
    }

    @Override
    protected Document obtenerXMLNoticias() {

        Document retorno = null;
        try {
            SAXBuilder parser = new SAXBuilder();
            File f = new File(ServletActionContext.getServletContext().getRealPath(getPathNoticias()));
            if (f.exists()) {
                if (f.length() > 0) {
                    retorno = parser.build(f);
                }
            }
        } catch (JDOMException  jde) {
        } catch (Exception e) {
            log.error("Error", e);
        }

        return retorno;

    }

    @Override
    public String getPathNoticias(){
        //idioma es heredado desde BaseAction
        if(idiomaElegido==null){
            log.debug("idioma: "+idioma);
            return pathNoticias+"/noticias_" + idioma + ".xml";
        }else{
            log.debug("idioma: "+idioma+" path: "+pathNoticias+"/noticias_" + idiomaElegido + ".xml");
            return pathNoticias+"/noticias_" + idiomaElegido + ".xml";

        }
    }

    @Override
    public void setPathNoticias(String aPathNoticias) {
        pathNoticias = aPathNoticias;
    }

    public String getIdiomaElegido() {
        return idiomaElegido;
    }

    public void setIdiomaElegido(String idiomaElegido) {
        this.idiomaElegido = idiomaElegido;
    }

    public boolean getInsertar() {
        return isInsertar();
    }

    public void setInsertar(boolean insertar) {
        this.insertar = insertar;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public String getEntradilla() {
        return entradilla;
    }

    public void setEntradilla(String entradilla) {
        this.entradilla = entradilla;
    }

    public String getFecha() {
        return fecha;
    }

    public void setFecha(String fecha) {
        this.fecha = fecha;
    }

    public String getCuerpo() {
        return cuerpo;
    }

    public void setCuerpo(String cuerpo) {
        this.cuerpo = cuerpo;
    }

    public String getAccion() {
        return accion;
    }

    public void setAccion(String accion) {
        this.accion = accion;
    }

    @Override
    public int getPagina() {
        return pagina;
    }

    @Override
    public void setPagina(int pagina) {
        this.pagina = pagina;
    }

    @Override
    public Integer getCuantos() {
        return cuantos;
    }
    
    @Override
    public void setCuantos(Integer cuantos) {
        this.cuantos = cuantos;
    }

    public boolean isInsertar() {
        return insertar;
    }

    public BaseActionAdmin getBsaadmin() {
        return bsaadmin;
    }

    public void setBsaadmin(BaseActionAdmin bsaadmin) {
        this.bsaadmin = bsaadmin;
    }
}
